// 给定一个字符串表达式s，表达式中所有整数为非负整数，运算符还有+-*/没有括号，实现一个基本计算器来计算并返回它的值

// 思路：
// 乘除运算优先于加减运算，我们可以先进行乘除运算，再将乘除运算的整数值放入原表达式相应位置，再依次计算加减
// 可以考虑用一个栈来保存进行乘除运算后的整数值，正整数直接压入栈中，负整数，则将对应整数取负号，再压入栈中

// 1. 遍历字符串，使用变量op标记数字之前的运算符，默认为+
// 2. 如果遇到数字，继续向后遍历，将数字累加，得到完整的整数num
// 如果op为+，将num压入栈
// 如果op为-，将-num压入栈
// 如果op为*，将栈顶元素top取出，计算top * num，并将计算结果压入栈中
// 如果op为/，将栈顶元素top取出，计算top / num，并将计算结果压入栈中
// 如果遇到+-*/操作符，则更新op
// 最后将栈中整数进行累加，并返回结果

function calculate(str) {
    let size = str.length
    let stack = []
    let op = '+'
    let num = 0
    for (let i = 0; i < size; i++) {
        if (!Number.isNaN(Number(str[i])) && str[i] !== ' ') {
            num = num * 10 + str[i].charCodeAt() - '0'.charCodeAt()
        }
        if (Number.isNaN(Number(str[i])) || i === size - 1) {
            switch (op) {
                case '+':
                    stack.push(num)
                    break;
                case '-':
                    stack.push(-num)
                    break;
                case '*':
                    stack.push(stack.pop() * num)
                    break;
                default:
                    stack.push(stack.pop() / num | 0)
                    break;
            }
            op = str[i]
            num = 0
        }
    }
    let ans = 0
    while (stack.length) {
        ans += stack.pop()
    }
    return ans
}

console.log(calculate('1+25*5-4'));